﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using Tibet.Entidades;

namespace Tibet.Datos
{
    public class AccesoPerfilMetrica
    {

        private Conexion InstanciarConexion()
        {
            Conexion nueva = new Conexion();
            return (nueva);
        }
        // Metodo que retorna true o false si inserto en la tabla o si ocurrio un error e inserta en perfil metrica
        public bool InsertarPerfilMetrica(PerfilMetrica perfilmetrica)
        {
            Conexion bd = InstanciarConexion();
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[INSPerfilMetrica]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                // Insercion del Perfil Metrica
                command.Parameters.AddWithValue("@Nombre", perfilmetrica.NombrePerfilMetrica);


                SqlDataReader reader = command.ExecuteReader();

                reader.Close();
                bd.CerrarConexionBd();
                return true;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }
        }
        // Metodo que retorna true o false si inserto en la tabla o si ocurrio un error e inserta en perfil metrica metrica
        public bool InsertarPerfilMetricaMetrica(int idPerfilMetrica, int idMetrica)
        {
            Conexion bd = InstanciarConexion();
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[INSPerfilMetricaMetrica]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                // Insercion del Perfil Metrica
                command.Parameters.AddWithValue("@id_Perfil_Metrica", idPerfilMetrica);
                command.Parameters.AddWithValue("@id_Metrica", idMetrica);

                SqlDataReader reader = command.ExecuteReader();

                reader.Close();
                bd.CerrarConexionBd();
                return true;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }
        }
        // Metodo que retorna true o false si modifico en la tabla o si ocurrio un error y modifica perfil metrica
        public bool ModificarPerfilMetrica(PerfilMetrica perfil)
        {
            Conexion bd = InstanciarConexion();
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[UPDPerfilMetrica]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@IdPerfil", perfil.IdPerfilMetrica);
                command.Parameters.AddWithValue("@NombrePerfil", perfil.NombrePerfilMetrica);
                SqlDataReader reader = command.ExecuteReader();

                reader.Close();
                bd.CerrarConexionBd();
                return true;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }
        }
        // Metodo que retorna true o false si elimina en la tabla o si ocurrio un error y elimina de 
        // perfil metrica metrica para luego insertar las nuevas
        public bool EliminarPerfilMetricaMetrica(int idPerfilMetrica)
        {
            Conexion bd = InstanciarConexion();
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[DELPerfilMetricaMetrica]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@IdPerfil", idPerfilMetrica);
                SqlDataReader reader = command.ExecuteReader();

                reader.Close();
                bd.CerrarConexionBd();
                return true;

            }
            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }
        }
        // Metodo que retorna una lista de las metricas ligadas a un perfil especifico
        public List<Metrica> ObtenerPerfilMetrica(Proyecto proyecto)
        {
            List<Metrica> metricas = new List<Metrica>();
            Conexion bd = InstanciarConexion();
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELMetricasDePerfil]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@IdProyecto", proyecto.Id);

                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Metrica miMetrica = new Metrica();
                    miMetrica.IdMetrica = reader.GetInt32(0);
                    miMetrica.NombreMetrica = reader["NombreMetrica"].ToString();
                    miMetrica.Descripcion = reader["Descripcion"].ToString();
                    metricas.Add(miMetrica);
                }


                reader.Close();
                bd.CerrarConexionBd();
                return metricas;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
        }
        // Metodo que trae el ultimo id que se inserto
        public int ConsultarMaxIdPerfil()
        {
            Conexion bd = InstanciarConexion();
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELMaxIdPerfilMetrica]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                // Insercion del Perfil Metrica

                SqlDataReader reader = command.ExecuteReader();
                int max = 0;
                while (reader.Read())
                {
                    max = reader.GetInt32(0);
                }
                reader.Close();
                bd.CerrarConexionBd();
                return max;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return 0;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return 0;
            }
        }
        //Metodo que regresa un perfil con el nombre del mismo y el id de las metricas que tiene para poder 
        //comparar en las pruebas
        public PerfilMetrica ConsultarPerfilMetricaMetricas(int idPerfilMetrica)
        {
            Conexion bd = InstanciarConexion();
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELPerfilMetricaMetricas]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                // Insercion del Perfil Metrica
                command.Parameters.AddWithValue("@Id", idPerfilMetrica);
                
                SqlDataReader reader = command.ExecuteReader();
                PerfilMetrica perfil = new PerfilMetrica();
                List<Metrica> metricas = new List<Metrica>();
                
                while (reader.Read())
                {
                    perfil.NombrePerfilMetrica = reader["P.NombrePerfilMetrica"].ToString();
                    Metrica miMetrica = new Metrica();
                    miMetrica.IdMetrica = reader.GetInt32(1);
                    metricas.Add(miMetrica);
                }

                reader.Close();
                bd.CerrarConexionBd();
                return perfil;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
        }
        //Metodo que se trae todos los perfiles almacenados
        public List<PerfilMetrica> ConsultarTodosLosPerfiles()
        {
            Conexion bd = InstanciarConexion();
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELNombrePerfilMetrica]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                
                SqlDataReader reader = command.ExecuteReader();
                
                List<PerfilMetrica> perfiles = new List<PerfilMetrica>();
                while (reader.Read())
                {
                    PerfilMetrica perfil = new PerfilMetrica();
                    perfil.IdPerfilMetrica = reader.GetInt32(0);
                    perfil.NombrePerfilMetrica = reader["NombrePerfilMetrica"].ToString();
                    perfiles.Add(perfil);                  
                }

                reader.Close();
                bd.CerrarConexionBd();
                return perfiles;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
        }


        public List<Metrica> ConsultarMetricasPorPerfil(PerfilMetrica perfil)
        {
            List<Metrica> metricas = new List<Metrica>();
            Conexion bd = InstanciarConexion();
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELMetricasDeUnPerfil]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@IdPerfil", perfil.IdPerfilMetrica);

                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Metrica miMetrica = new Metrica();
                    miMetrica.IdMetrica = reader.GetInt32(0);
                    miMetrica.NombreMetrica = reader["NombreMetrica"].ToString();
                    miMetrica.Descripcion = reader["Descripcion"].ToString();
                    metricas.Add(miMetrica);
                }


                reader.Close();
                bd.CerrarConexionBd();
                return metricas;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
        }





    
    }
}
